home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / mgr / sparcmgr / src.zoo / src / do_event.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-23  |  10.3 KB  |  371 lines

  1. /*                        Copyright (c) 1987 Bellcore
  2.  *                            All Rights Reserved
  3.  *       Permission is granted to copy or use this program, EXCEPT that it
  4.  *       may not be sold for profit, the copyright notice must be reproduced
  5.  *       on copies, and credit should be given to Bellcore where it is due.
  6.  *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
  7.  */
  8. /*    $Header: do_event.c,v 1.3 89/04/17 19:46:21 sau Exp $
  9.     $Source: /m1/mgr.new/src/RCS/do_event.c,v $
  10. */
  11. static char    RCSid_[] = "$Source: /m1/mgr.new/src/RCS/do_event.c,v $$Revision: 1.3 $";
  12.  
  13. /* do a button event */
  14.  
  15. #include <stdio.h>
  16. #include "bitmap.h"
  17. #include "defs.h"
  18. #include "font.h"
  19. #include "event.h"
  20.  
  21. #define FSIZE(c)    ((int) (W(font)->head.c))    /* from put_window.c */
  22. #define SUB_SIZE    256                /* max temp str size */
  23. #define START_SIZE   16          /* default starting size of sweep object */
  24.  
  25. do_event(event,win,flag)
  26. int event;                /* event number */
  27. register WINDOW *win;            /* window event applies to */
  28. int flag;                /* type of window */
  29.     {
  30.     register char *buff, *p;
  31.     char *index();
  32.  
  33.     if (!win)
  34.         return(-1);
  35.  
  36. #ifdef DEBUG
  37.     dprintf(e)(stderr,"%s: event %d (%s) %s\r\n",W(tty),GET_EVENT(event),
  38.                  IS_EVENT(win,event)?"ON":"OFF",flag==E_MAIN ? "MAIN":"STACK");
  39. #endif
  40.  
  41.         /* look for stacked events */
  42.  
  43.         if (IS_EVENT(win,EVENT_STFLAG))
  44.             do_event(event,win->stack,E_STACK);
  45.  
  46.         if (IS_EVENT(win,event) && (flag==E_MAIN || IS_EVENT(win,EVENT_STACK))) {
  47.  
  48. #ifdef DEBUG
  49.             dprintf(e)(stderr,"\tSENT\r\n");
  50. #endif
  51.  
  52.             /* do the event */
  53.  
  54.             switch(event) {
  55.             case EVENT_B1_DOWN:
  56.             case EVENT_B2_DOWN:
  57.                  if (IS_EVENT(win,event) && (buff= W(events[GET_EVENT(event)])))
  58.                     write_event(win,buff,E_LIST_BUTTON);
  59.  
  60.                  /* notify clicked window */
  61.  
  62.                  for(win=active;win != (WINDOW *) 0;win=W(next))
  63.                     if(mousein(mousex,mousey,win,1))
  64.                        break;
  65.                  if (win && IS_EVENT(win,EVENT_TELLME)
  66.                          && (buff= W(events[GET_EVENT(EVENT_TELLME)]))) {
  67.                     if (message) { 
  68.                        free(message);
  69.                        message = (char *) 0;
  70.                        }
  71.                     id_message = ACTIVE(pid);
  72.                     write_event(win,buff,E_LIST_ACCEPT);
  73.                     }
  74.                  break;
  75.             case EVENT_PASTE:
  76.                  if (IS_EVENT(win,event) && (buff= W(events[GET_EVENT(event)])))
  77.                     write_event(win,buff,E_LIST_PASTE);
  78.                  break;
  79.             case EVENT_SNARFED:
  80.                  if (IS_EVENT(win,event) && (buff= W(events[GET_EVENT(event)])))
  81.                     write_event(win,buff,E_LIST_SNARF);
  82.                  break;
  83.             case EVENT_BSYS_DOWN:    /* No events for System Button, down or up. */
  84.             case EVENT_BSYS_UP:    
  85.                 break;
  86.             case EVENT_B1_UP:
  87.             case EVENT_B2_UP:
  88.                 if (IS_EVENT(win,event) && (buff= W(events[GET_EVENT(event)])))
  89.                     write_event(win,buff,E_LIST_UP);
  90.             break;
  91.             case EVENT_SHAPE:
  92.             case EVENT_MOVE:
  93.             case EVENT_DESTROY:
  94.             case EVENT_REDRAW:
  95.             case EVENT_COVERED:
  96.             case EVENT_UNCOVERED:
  97.             case EVENT_DEACTIVATED:
  98.             case EVENT_ACTIVATED:
  99.                  buff = W(events[GET_EVENT(event)]);
  100.                  if (buff && *buff) {
  101.                     Write(W(to_fd),buff,strlen(buff));
  102. #ifdef DEBUG
  103.                     dprintf(e)(stderr,"  sending %d [%s]\r\n",strlen(buff),buff);
  104. #endif
  105.                     }
  106. #ifdef DEBUG
  107.                  else
  108.                     dprintf(e)(stderr,"  oops! nothing to send\r\n");
  109. #endif
  110.                  break;
  111.             case EVENT_ACCEPT:
  112.                  if (mode_ok(W(tty),MSG_MODEMASK) &&
  113.                      message && (buff= W(events[GET_EVENT(event)]))) {
  114. #ifdef DEBUG
  115.                     dprintf(e)(stderr,"  accept: %d:  [%s]\r\n",strlen(buff),buff);
  116.                     dprintf(c)(stderr,"  sent %d->%d: %s\r\n",
  117.                                id_message,W(pid),message);
  118. #endif
  119.                     write_event(win,buff,E_LIST_ACCEPT);
  120.                     }
  121. #ifdef DEBUG
  122.                  else {
  123.                     dprintf(c)(stderr,"%d: can't send [%s] to %s\r\n",
  124.                                id_message,message?message:"??",W(tty));
  125.                     dprintf(e)(stderr,"  reject accept: %s %s %s\r\n",
  126.                                mode_ok(W(tty),MSG_MODEMASK) ? "OK" :
  127.                                               "BAD_MODE",
  128.                                message?message:"NO MESSAGE",
  129.                                buff?buff:"NO EVENT");
  130.                     }
  131. #endif
  132.                  break;
  133. #ifdef DEBUG
  134.             default: 
  135.                  dprintf(e)(stderr,"  oops! unknown event\r\n");
  136. #endif
  137.             } /* end switch */
  138.         }
  139.     return(0);
  140.     }
  141.  
  142. /* substitute %x into str, returns true if an area was swept. */
  143.  
  144. int
  145. sub_event(win,str,c,swept,count,args)
  146. register WINDOW *win;
  147. register char *str,c;
  148. int swept;     /* if swept, don't do sweeps */
  149. int count;     /* # of sweep args */
  150. int *args;     /* the arg list */
  151.     {
  152.     int sweep = 0;
  153.     static int x,y;
  154.     char *get_id();
  155.     int code;    /* for text sweeping */
  156.  
  157.  
  158. #ifdef DEBUG
  159.     if (debug) {
  160.         register int i;
  161.         dprintf(e)(stderr,"%s) event (%c) args:",W(tty),c);
  162.         for(i=0;i<count;i++)
  163.             dprintf(e)(stderr," %d",args[i]);
  164.         dprintf(e)(stderr,"\r\n");
  165.         }
  166. #endif
  167.  
  168.     /* setup initial sweep conditions */
  169.  
  170.     if (swept == 0) {    /* no sweep - set up initial conditions */
  171.         if (count >=2) {
  172.             x = args[0];
  173.             y = args[1];
  174.             }
  175.         else if (c == E_SWTEXT || c == E_SWTEXTT) {
  176.             x = 0;
  177.             y = 0;
  178.             }
  179.         else {
  180.             x = START_SIZE;
  181.             y = START_SIZE;
  182.             }
  183. #ifdef DEBUG
  184.         dprintf(e)(stderr,"initial sweep (x,y) = (%d,%d)\r\n",x,y);
  185. #endif
  186.         count = 0;
  187.         }
  188.  
  189.     switch(c) {
  190.         case E_CPOS:    /* return mouse position (rows/cols) */
  191.             sprintf(str,"%d %d",(mousex-(W(x0)+W(text).x))/FSIZE(wide),
  192.                                 (mousey-(W(y0)+W(text).y))/FSIZE(high));
  193.             break;
  194.         case E_POS:        /* return mouse position */
  195.             if (W(flags)&W_ABSCOORDS)
  196.                sprintf(str,"%d %d",mousex-W(x0),mousey-W(y0));
  197.             else
  198.                sprintf(str,"%d %d", (mousex-W(x0))*GMAX/BIT_WIDE(W(window)),
  199.                                   (mousey-W(y0))*GMAX/BIT_HIGH(W(window)));
  200.             break;
  201.         case E_SWLINE:        /* sweep out line */
  202.             sweep++;
  203.             if (!swept)
  204.                get_rect(screen,mouse,mousex,mousey,&x,&y,1);
  205.             sprintf(str,"%d %d %d %d",mousex-W(x0),mousey-W(y0),
  206.                                      mousex+x-W(x0),mousey+y-W(y0));
  207.             break; 
  208.         case E_SWRECT:        /* sweep out rectangle */
  209.             sweep++;
  210.             if (!swept)
  211.                get_rect(screen,mouse,mousex,mousey,&x,&y,0);
  212.             sprintf(str,"%d %d %d %d",mousex-W(x0),mousey-W(y0),
  213.                                      mousex+x-W(x0),mousey+y-W(y0));
  214.             break; 
  215.         case E_SWRECTA:        /* sweep out rectangle */
  216.             sweep++;
  217.             if (!swept)
  218.                get_rect(screen,mouse,mousex,mousey,&x,&y,0);
  219.             sprintf(str,"%d %d %d %d",mousex,mousey,
  220.                                      mousex+x,mousey+y);
  221.             break; 
  222.       case E_SWBOX:     /* sweep out box */
  223.          sweep++;
  224.          if (!swept)
  225.             move_box(screen,mouse,&mousex,&mousey,x,y,1);
  226.          sprintf(str,"%d %d",mousex-W(x0),mousey-W(y0));
  227.          break;
  228.       case E_SWBOXA:    /* sweep out box */
  229.          sweep++;
  230.          if (!swept)
  231.             move_box(screen,mouse,&mousex,&mousey,x,y,1);
  232.          sprintf(str,"%d %d",mousex,mousey);
  233.          break;
  234.         case E_SWTEXTT:        /* sweep out text */
  235.         case E_SWTEXT:        /* sweep out text */
  236.             sweep++;
  237.             code = 0;
  238.             if (!swept)
  239.                 code = get_text(screen,mouse,mousex,mousey,&x,&y,win,c);
  240.             sprintf(str,code ? "%d %d %d %d" : "",
  241.                     (mousex-(W(x0)+W(text.x)))/FSIZE(wide),
  242.                     (mousey-(W(y0)+W(text.y)))/FSIZE(high),
  243.                     x,y);
  244.             break; 
  245.         case E_NOTIFY:        /* get other windows notify text */
  246.             for(win=active;win != (WINDOW *) 0;win=W(next)) {
  247.                if (mousein(mousex,mousey,win,1))
  248.                   break;
  249.                }
  250.             if (win && IS_EVENT(win,EVENT_NOTIFY))
  251.                sprintf(str,"%.*s",SUB_SIZE-1,W(events[GET_EVENT(EVENT_NOTIFY)]));
  252.             else
  253.                sprintf(str,"");
  254.             break; 
  255.         case E_WHO:        /* send other windows id */
  256.             for(win=active;win != (WINDOW *) 0;win=W(next)) {
  257.                if (mousein(mousex,mousey,win,1))
  258.                   break;
  259.                }
  260.             if (win)
  261.                sprintf(str,"%.*s",SUB_SIZE-1,get_id(win));
  262.             else
  263.                sprintf(str,"");
  264.             break; 
  265.         case E_WHOSIZE:        /* send other windows size */
  266.             for(win=active;win != (WINDOW *) 0;win=W(next)) {
  267.                if (mousein(mousex,mousey,win,1))
  268.                   break;
  269.                }
  270.             if (win)
  271.                sprintf(str,"%d %d %d %d",
  272.                        W(x0),W(y0),BIT_WIDE(W(border)),BIT_HIGH(W(border)));
  273.             else
  274.                sprintf(str,"");
  275.             break; 
  276.         case E_FROM:            /* see who message is from */
  277.             sprintf(str,"%d",id_message);
  278.             break; 
  279.         case E_MESS:
  280.             if (message)
  281.                sprintf(str,"%.*s",SUB_SIZE-1,message);
  282.             else
  283.                *str = '\0';
  284.             break; 
  285.         case E_MSGSIZE:
  286.             sprintf(str,"%d",message ? strlen(message) : 0);
  287.             break; 
  288.         case E_SNARFSIZE:                /* size of snarf buffer */
  289.             sprintf(str,"%d",snarf ? strlen(snarf) : 0);
  290.             break; 
  291.         case E_SNARFBUF:                /* contents of snarf buffer */
  292.             if (snarf)
  293.                sprintf(str,"%.*s",SUB_SIZE-1,snarf);
  294.             else
  295.                *str = '\0';
  296.             break; 
  297.         case E_TIMESTAMP:        /* 100ths seconds since MGR startup */
  298.             sprintf(str,"%d",timestamp());
  299.             break; 
  300.         case E_ESC:            /* the escape char */
  301.             strcpy(str,"%");
  302.             break; 
  303.         }
  304.     return(sweep);
  305.     }
  306.  
  307. /* write the event to a process */
  308.  
  309. write_event(win,str,list)
  310. WINDOW *win;                /* window to get info about */
  311. char *str;                /* event string */
  312. char *list;                /* list of valid event chars */
  313.     {
  314.     char *index();
  315.     char data[SUB_SIZE];
  316.     int args[4];         /* arguments to sweep event */
  317.     int count;           /* # of args */
  318.     register char *start;
  319.     char *end, *event_args();
  320.     int swept = 0;            /* already did a sweep */
  321.  
  322.     for(start=str;*start && (end=index(start,E_ESC));start=end+1) {
  323. #ifdef DEBUG
  324.         dprintf(e)(stderr,"  sending %d [%s]\r\n",strlen(str),str);
  325. #endif
  326.         if (end>start) 
  327.             Write(W(to_fd),start,end-start);
  328.         end = event_args(end,&count,args);
  329.         if (index(list,*end)) {
  330.             swept += sub_event(win,data,*end,swept,count,args);
  331.             Write(W(to_fd),data,strlen(data));
  332.             }
  333.         }
  334.     if (*start)
  335.         Write(W(to_fd),start,strlen(start));
  336.     if( swept )
  337.         /* If we swept something, the button was down and is now up.  Notify
  338.      do_button(). */
  339.         do_button(0);
  340.     }
  341.  
  342. /* extract numeric argument from sweep events */
  343.  
  344. char *
  345. event_args(str,count,args)
  346. char *str;        /*  beginning of args */
  347. int *count;       /* # of args */
  348. int *args;        /* where to put args */
  349.     {
  350.     register char c, *pntr = str;    /* 1st char of args */
  351.  
  352.     while ((c = *++pntr) >= '0' && c <= '9' || c==',' || c=='-')
  353.         ;
  354.     *count = sscanf(str+1,"%d,%d,%d,%d",args,args+1,args+2,args+3);
  355.     return(pntr);
  356.     }
  357.  
  358. /* compute a unique window id */
  359.  
  360. char *
  361. get_id(win)
  362. register WINDOW *win;
  363.     {
  364.     int sub = W(num);    /* subwindow number */
  365.     int main = W(pid);    /* main window id */
  366.     static char buff[6];
  367.     
  368.     sprintf(buff,"%d.%d",main,sub);
  369.     return(buff);
  370.     }
  371.